package com.king.pattem.singleton;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 登记式单例（线程安全）
 * 维护的是一组单例类的实例，将这些实例存放在一个Map（登记薄）中，对于已经登记过的实例，则从工厂直接返回，对于没有登记的，则先登记，而后返回。
 * @author taomk
 */
public class RegSingleton implements Serializable {
	/**
     * 登记薄,用来存放所有登记的实例
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
	private static Map<String, RegSingleton> registry = new HashMap();
    //在类加载的时候添加一个实例到登记薄
    static {
        RegSingleton x = new RegSingleton();
        registry.put(x.getClass().getName(), x);
    }
    /**
     * 受保护的默认构造方法
     */
    private RegSingleton() {
        System.out.println("RegSingleton is create");
    }
    /**
     * 静态工厂方法,返回指定登记对象的唯一实例;
     * 对于已登记的直接取出返回,对于还未登记的,先登记,然后取出返回
     * @param name
     * @return RegSingleton
     */
    public final static synchronized RegSingleton getInstance(String name) {
        if (name == null) {
            name = "RegSingleton";
        }
        if (registry.get(name) == null) {
            try {
                registry.put(name, (RegSingleton) Class.forName(name).newInstance());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
        return registry.get(name);
    }
    /**
     * 一个示意性的商业方法
     * @return String
     */
    public final String about() {
        return "Hello,I am RegSingleton!";
    }

}
